package com.java.basis.date;

import org.junit.Test;

import java.util.Calendar;

/**
 * @author wangning
 * @create 2021-04-15 14:46
 */
public class TestCalendar01 {
	public static void main(String[] args) {
		Calendar instance = Calendar.getInstance();
		System.out.println("--------Calendar--------");
		System.out.println("instance = " + instance);
		System.out.println(instance.getTime());
		System.out.println(instance.get(Calendar.YEAR));
		System.out.println(Calendar.DATE);
		System.out.println(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 1.如何创建 Calendar 对象
	 * Calendar 是一个抽象类, 无法通过直接实例化得到对象. 因此, Calendar 提供了一个方法 getInstance,
	 * 来获得一个Calendar对象, 得到的 Calendar 由当前时间初始化.
	 */
	@Test
	public void newCalendar() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, 1);
		
		System.out.println("calendar = " + calendar);
		System.out.println("年："+calendar.get(Calendar.YEAR));
		System.out.println("月："+(calendar.get(Calendar.MONTH)+1));
		System.out.println("日："+calendar.get(Calendar.DAY_OF_MONTH));
		System.out.println("时："+calendar.get(Calendar.HOUR_OF_DAY));
		System.out.println("分："+calendar.get(Calendar.MINUTE));
		System.out.println("秒："+calendar.get(Calendar.SECOND));
		System.out.println("毫秒："+calendar.get(Calendar.MILLISECOND));
	}

	/**
	 * 2.字段详解
	 * Calendar 中 set 和 get 时间都是通过在参数中填入不同的字段来实现的, 不过有部分字段的常量值与约定俗成的值不相同
	 *
	 * YEAR - 默认情况下为年份
	 * MONTH - 指示当前年中的月份数,一年中的一月的值为 0，取值0-11对应一到十二月
	 * 需要注意的是 JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER 分别与 [0, 11] 对应, 在设置和获取日期时要格外注意
	 * WEEK_OF_YEAR - 指示当前年中的星期数. 一年中的第一个星期的值为 1.
	 * WEEK_OF_MONTH - 指示当前月中的星期数. 一个月中第一个星期的值为 1.
	 * DAY_OF_MONTH - 指示一个月中的某天. 它与 DATE 是同义词. 一个月中第一天的值为 1.
	 * DATE - 同 DAY_OF_MONTH
	 * DAY_OF_YEAR - 指示当前年中的天数. 一年中第一天的值为 1.
	 * DAY_OF_WEEK - 指示一个星期中的某天, 一周中第一天的值为 1.
	 * 需要 注意 的是, 与中国人的习惯不同, 此处一周中的第一天为 周日.
	 * 一周的顺序依次为: 周日(1), 周一(2), 周二(3), 周三(4), 周四(5), 周五(6), 周六(7) 在设置和获取日期时要格外注意
	 * AM_PM - 指示 HOUR 是在中午之前还是在中午之后. [0, 12) 为上午, AM_PM 值为 1 [12, 24)为下午, AM_PM 值为 0
	 * HOUR - 指示上午或下午的小时.
	 * HOUR_OF_DAY - 指示一天中的小时。 HOUR_OF_DAY 用于 24 小时制时钟
	 * MINUTE - 分钟
	 * SECOND - 秒
	 *
	 */
	@Test
	public void TestGetOrSetOfCalendar() {
		//下面字段我们以 1998 年 2 月 28 日 23 时 11 分 11 秒 来讲解
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, 1998);
		cal.set(Calendar.MONTH, 1);
		cal.set(Calendar.DATE, 28);
		cal.set(Calendar.HOUR_OF_DAY, 23);
		cal.set(Calendar.MINUTE, 11);
		cal.set(Calendar.SECOND, 11);
		System.out.println("cal = " + cal);
		cal.add (Calendar.YEAR, 1);//年 
		cal.add (Calendar.MONTH, 1);//月 
		cal.add (Calendar.DATE, 1);//日 
		cal.add (Calendar.HOUR_OF_DAY, -1);//时 
		cal.add (Calendar.MINUTE, 1);//分 
		cal.add (Calendar.SECOND, 1);//秒 
		cal.add (Calendar.DATE, 7);//周


	}
}
